package com.lyx.crm.service;

import cn.hutool.core.util.StrUtil;
import com.lyx.crm.base.BaseService;
import com.lyx.crm.dao.ModuleMapper;
import com.lyx.crm.dao.PermissionMapper;
import com.lyx.crm.model.TreeModel;
import com.lyx.crm.utils.AssertUtil;
import com.lyx.crm.vo.Module;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Package: com.lyx.crm.service
 * @ClassName: ModuleService
 * @Author: lyx
 * @CreateTime: 2021/9/6 15:43
 * @Description:
 */
@Service
public class ModuleService extends BaseService<Module, Integer> {
    @Autowired
    private ModuleMapper moduleMapper;
    @Autowired
    private PermissionMapper permissionMapper;


    /**
     * 查询所有的资源列表
     *
     * @return
     */
    public List<TreeModel> queryAllModules(Integer roleId) {
        // 查询所有的资源列表
        List<TreeModel> treeModelList = moduleMapper.queryAllModules();
        // 查询指定角色已经授权过的资源列表 (查询角色拥有的资源ID)
        List<Integer> permissionIds = permissionMapper.queryRoleHasModuleIdsByRoleId(roleId);
        // 判断角色是否拥有资源ID
        if (permissionIds != null && permissionIds.size() > 0) {
            // 循环所有的资源列表，判断用户拥有的资源ID中是否有匹配的，如果有，则设置checked属性为true
            treeModelList.forEach(treeModel -> {
                if (permissionIds.contains(treeModel.getId())) {
                    // 如果包含你，则说明角色授权过，设置checked为true
                    treeModel.setChecked(true);
                }
            });
        }
        return treeModelList;
    }

    /**
     * 查询资源列表
     *
     * @return
     */
    public Map<String, Object> queryModuleList() {
        Map<String, Object> map = new HashMap<>();
        List<Module> modules = moduleMapper.queryMOduleList();
        map.put("code", 0);
        map.put("msg", "");
        map.put("count", modules.size());
        map.put("data", modules);
        return map;
    }

    /**
     * 添加资源
     * 1. 参数校验
     * 模块名称 moduleName
     * 非空，同一层级下模块名称唯一
     * 地址 url
     * 二级菜单（grade=1），非空且同一层级下不可重复
     * 父级菜单 parentId
     * 一级菜单（目录 grade=0）    -1
     * 二级|三级菜单（菜单|按钮 grade=1或2）    非空，父级菜单必须存在
     * 层级 grade
     * 非空，0|1|2
     * 权限码 optValue
     * 非空，不可重复
     * 2. 设置参数的默认值
     * 是否有效 isValid    1
     * 创建时间createDate  系统当前时间
     * 修改时间updateDate  系统当前时间
     * 3. 执行添加操作，判断受影响的行数
     *
     * @param module
     * @return void
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void addModule(Module module) {
        /* 参数校验*/
        //层级校验
        Integer grade = module.getGrade();
        AssertUtil.isTrue(null == grade, "菜单层级不合法！");
        //模块名称校验
        AssertUtil.isTrue(module.getModuleName() == null, "模块名不能为空！");
        //模块名称 module Name同一层级下名称唯一
        AssertUtil.isTrue(null != moduleMapper.queryModuleByGradeAndModuleName(module.getParentId(), grade, module.getModuleName()), "该层级下模块名称已存在");

        //如果是二级菜单（grade==1)
        if (grade == 1) {
//            地址url 二级菜单(grade=1)   url非空
            AssertUtil.isTrue(StrUtil.isBlank(module.getUrl()), "URL不能为空");
            //地址url 二级菜单(grade=1)   且同一层级下不能重复
            AssertUtil.isTrue(null != moduleMapper.queryModuleByGradeAndUrl(grade, module.getUrl()), "该层级下URL已存在");
        }

        //父级菜单 parentId  一级菜单（目录 grade=0）  null
        if (grade == 0) {
            module.setParentId(-1);
            module.setUrl("#");
        }
        //父级菜单 parentId 二级|三级菜单（菜单|按钮 grade=1或2）    非空，父级菜单必须存在
        if (grade != 0) {
            //非空
            AssertUtil.isTrue(null == module.getParentId(), "父级菜单不能为空!");
            //父级菜单必须存在(将父级菜单的ID作为主键,查询资源记录)
            AssertUtil.isTrue(null == moduleMapper.selectByPrimaryKey(module.getParentId()), "请指定父级菜单");

        }

        //权限码 optValue      非空
        AssertUtil.isTrue(StrUtil.isBlank(module.getOptValue()), "权限码不能为空!");
        //权限码 optValue      不可重复
        AssertUtil.isTrue(null != moduleMapper.queryModuleByOptValue(module.getOptValue()), "权限码已存在!");

        /*设置基本参数*/
        //is_valid =1
        module.setIsValid((byte) 1);
        //时间
        module.setCreateDate(new Date());
        module.setUpdateDate(new Date());

        //插入数据库
        AssertUtil.isTrue(moduleMapper.insertSelective(module) < 1, "添加资源操作失败");
    }

    public Module queryModuleByPrimaryId(Integer moduleId) {
        AssertUtil.isTrue(null == moduleId, "要修改的资源id为空");

        Module module = moduleMapper.selectByPrimaryKey(moduleId);

        AssertUtil.isTrue(null == module, "要修改的资源为空，不存在");

        return module;
    }

    /**
     * 删除资源操作
     *
     * @param moduleId
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void deleteModuleByPrimaryKey(Integer moduleId) {


    }
}
